﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Ukladanka
{
    public partial class Form1 : Form
    {
        private static NPuzzles ukladanka;
        

        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {

        }

        private void otwórzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog obrazek = new OpenFileDialog();
            obrazek.Filter = "jpg |*.jpg";
            obrazek.Multiselect = false;
            obrazek.ShowDialog();
            if (obrazek.FileName != "")
            {
                this.pictureBox1.Load(obrazek.FileName);
            }
            else
            {
                Application.Exit();
            }
            Image im = Image.FromFile(obrazek.FileName);

            this.pictureBox1.Image = this.RysujLinieSiatki(im,4);

            ukladanka = this.StworzNPuzzlesZObrazka(im, 4);
            ukladanka.WymieszajUkladanke();
            this.pictureBox1.Image = this.RysujLinieSiatki(ukladanka.GenerujObrazUkladanki(),4);
        }

        private Image RysujLinieSiatki(Image im, int poziomTrudnosci)
        {
            Bitmap bm = new Bitmap(new Bitmap(im));
            Graphics g = Graphics.FromImage(bm);

            for (int i = 1; i < poziomTrudnosci; i++)
            {
                g.DrawLine(Pens.Blue, i * (im.Width / 4), 0, i * (im.Width / 4), im.Height);
                g.DrawLine(Pens.Blue, 0, i * (im.Height / 4), im.Width, i * (im.Height / 4));
            }

            return (Image)bm;
        }

        private NPuzzles StworzNPuzzlesZObrazka(Image im, int poziomTrudnosci)
        {
            Bitmap bm = new Bitmap(new Bitmap(im));
            System.Drawing.Imaging.PixelFormat pixformat = bm.PixelFormat;
            NPuzzles ukladanka = new NPuzzles(poziomTrudnosci, bm);

            Rectangle currwycinek;
            Puzzle currpuzzle;

            int szerokoscpuzzle = im.Width/poziomTrudnosci;
            int wysokoscpuzzle = im.Height/poziomTrudnosci;

            for (int i = 0; i < poziomTrudnosci; i++)
            {
                for(int j = 0; j < poziomTrudnosci; j++)
                {
                    currwycinek = new Rectangle(j*szerokoscpuzzle,i*wysokoscpuzzle,szerokoscpuzzle,wysokoscpuzzle);
                    Bitmap wycinek = bm.Clone(currwycinek, pixformat);
                    currpuzzle = new Puzzle(i * poziomTrudnosci + j, wycinek);
                    ukladanka.DodajPuzzle(currpuzzle, i * poziomTrudnosci + j);
                }
            }
            return ukladanka;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                //MessageBox.Show(this.pictureBox1.Size.ToString());
                //MessageBox.Show(ObliczKtoryKlocekKlikniety(e.X,e.Y).ToString());
                //MessageBox.Show(e.X + " " + e.Y);
                ukladanka.WykonajRuch(ObliczKtoryKlocekKlikniety(e.X, e.Y));
                this.pictureBox1.Image = this.RysujLinieSiatki((Image)ukladanka.GenerujObrazUkladanki(),4);
            }
        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private int ObliczKtoryKlocekKlikniety(int xmyszki, int ymyszki)
        {
            int wktorejkolumnie = 0, wktorymwierszu = 0;

            //szerokosci klockow wyswietlanych w picturebox sa inne niz szerokosci klockow przechowywanych w ukladance
            //ze wzgledu na roznice w  rozmiarach picturebox (500x500) a zmiennej rozdzielczosci wczytywanego obrazka
            int szerokoscklocka = this.pictureBox1.Width / ukladanka.GetPoziomTrudnosci();
            int wysokoscklocka = this.pictureBox1.Height / ukladanka.GetPoziomTrudnosci();

            while (xmyszki - szerokoscklocka > 0)
            {
                wktorejkolumnie++;
                xmyszki -= szerokoscklocka;
            }
            while (ymyszki - wysokoscklocka > 0)
            {
                wktorymwierszu++;
                ymyszki -= wysokoscklocka;
            }

            return wktorymwierszu * ukladanka.GetPoziomTrudnosci() + wktorejkolumnie;
        }
    }
}
